#include "../sylar/sylar.h"
#include <cassert>

// 全局日志对象，用于测试输出
sylar::Logger::ptr g_logger = SYLAR_LOG_NAME("fiber_scheduler_test");

void run_in_fiber()
{
    SYLAR_LOG_INFO(g_logger) << "run_in_fiber begin";
    sylar::Fiber::YieldToHold();
    SYLAR_LOG_INFO(g_logger) << "run_in_fiber end";
    sylar::Fiber::YieldToHold();
}

void test_fiber()
{

    auto ok_ = sylar::Fiber::GetThis();
    SYLAR_LOG_INFO(g_logger) << "main begin";
    SS()<< ok_.get() <<"  "; 
    sylar::Fiber::ptr fiber(new sylar::Fiber(run_in_fiber));
    fiber->swapIn();
    SYLAR_LOG_INFO(g_logger) << "main after swapin";
    fiber->swapIn();
    SYLAR_LOG_INFO(g_logger) << "main after end";
    fiber->swapIn();
}
void test2()
{
    test_fiber();
}
// 验证t_scheduler_fiber实例化的核心测试函数
void test_t_scheduler_fiber_instantiation() {
    SYLAR_LOG_INFO(g_logger) << "===== 开始t_scheduler_fiber实例化验证 =====";

    // 记录初始纤维总数（主纤维）
    uint64_t initial_fiber_count = sylar::Fiber::TotalFibers();
    SYLAR_LOG_INFO(g_logger) << "初始纤维总数: " << initial_fiber_count;

    // 关键步骤：创建Scheduler对象（use_caller=true确保在当前线程初始化t_scheduler_fiber）
    sylar::Scheduler scheduler(1, true, "test_scheduler");
    SYLAR_LOG_INFO(g_logger) << "Scheduler对象创建完成（线程数=1, use_caller=true）";

    // 验证t_scheduler_fiber是否被正确实例化
    assert(sylar::Scheduler::GetMainFiber() != nullptr);
    SYLAR_LOG_INFO(g_logger) << "t_scheduler_fiber指针验证通过: " << sylar::Scheduler::GetMainFiber();

    // 验证t_scheduler_fiber的状态（应为INIT或READY，未执行）
    sylar::Fiber::State state = sylar::Scheduler::GetMainFiber()->getState();
    assert(state == sylar::Fiber::INIT || state == sylar::Fiber::READY);
    SYLAR_LOG_INFO(g_logger) << "t_scheduler_fiber状态验证通过: " << state;

    // 验证纤维总数增加（主纤维 + scheduler创建的纤维）
    uint64_t after_scheduler_count = sylar::Fiber::TotalFibers();
    assert(after_scheduler_count == initial_fiber_count + 1);
    SYLAR_LOG_INFO(g_logger) << "纤维总数变化验证通过（增加1个scheduler纤维）: " << after_scheduler_count;

    SYLAR_LOG_INFO(g_logger) << "===== t_scheduler_fiber实例化验证完成 =====";


    test2();
    scheduler.stop();

}

int main(int argc, char**argv) {
    // 初始化工具和日志系统（遵循项目测试规范）
    sylar::InitUtil();
    SYLAR_LOG_INIT();

    // 执行核心测试
    test_t_scheduler_fiber_instantiation();

    return 0;
}